package com.nuanshui.heatedloan.baseservice.express;

import com.nuanshui.framework.lang.SysStringUtils;
import com.nuanshui.framework.security.MD5Util;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;
import java.util.Map.Entry;

public class SnCal {
	
	public static String cal(Map<String, String> paramsMap, String apiPath, String sk) {

		// 计算sn跟参数对出现顺序有关，所以用LinkedHashMap保存<key,value>，此方法适用于get请求，
		//如果是为发送post请求的url生成签名，请保证参数对按照key的字母顺序依次放入Map。
		//以get请求为例：http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=yourak，paramsMap中先放入address，再放output，然后放ak，放入顺序必须跟get请求中对应参数的出现顺序保持一致。
		
		// 调用下面的toQueryString方法，对LinkedHashMap内所有value作utf8编码，拼接返回结果address=%E7%99%BE%E5%BA%A6%E5%A4%A7%E5%8E%A6&output=json&ak=yourak
		String paramsStr = SysStringUtils.toQueryString(paramsMap);

		// 对paramsStr前面拼接上/geocoder/v2/?，后面直接拼接yoursk得到/geocoder/v2/?address=%E7%99%BE%E5%BA%A6%E5%A4%A7%E5%8E%A6&output=json&ak=yourakyoursk
//		String wholeStr = new String("/geocoder/v2/?" + paramsStr + "&ak="+ ak + sk);
		String wholeStr = new String(apiPath + paramsStr + sk);

		// 对上面wholeStr再作utf8编码
		String tempStr = "";
		
		try {
			tempStr = URLEncoder.encode(wholeStr, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			
		}

		// 调用下面的MD5方法得到最后的sn签名7de5a22212ffaa9e326444c75a58f9a0

		return MD5Util.md5(tempStr);
	}

	// 对Map内所有value作utf8编码，拼接返回结果
	public static String toQueryString(Map<String, String> data) {
		StringBuilder queryString = new StringBuilder();
		for (Entry<String, String> pair : data.entrySet()) {
			queryString.append(pair.getKey() + "=");
			try {
				queryString.append(URLEncoder.encode(pair.getValue(),
						"UTF-8") + "&");
			} catch (UnsupportedEncodingException e) {

			}
		}
		if (queryString.length() > 0) {
			queryString.deleteCharAt(queryString.length() - 1);
		}
		return queryString.toString();
	}

	// 来自stackoverflow的MD5计算方法，调用了MessageDigest库函数，并把byte数组结果转换成16进制
	public static String MD5(String md5) {
		try {
			java.security.MessageDigest md = java.security.MessageDigest
					.getInstance("MD5");
			byte[] array = md.digest(md5.getBytes());
			StringBuilder sb = new StringBuilder();
			for (int i = 0; i < array.length; ++i) {
				sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100)
						.substring(1, 3));
			}
			return sb.toString();
		} catch (java.security.NoSuchAlgorithmException e) {
		}
		return null;
	}

}